/**
 * @Author yang
 * @Description //TODO
 * @Date 2021/2/20
 * @Time 11:09
 **/
package main

import (
	"encoding/json"
	"fmt"
	"github.com/dovejb/quicktag"
	"reflect"
)

type Person struct {
	Name       string
	Age        int
	MyChildren []Person
}

func MyStyleConvertFunc(source string) (target string) {

	return source + "_target"
}

//
func init() {
	// 自定义转换风格, 默认quicktag.PascalToUnderline, 无omitempty
	quicktag.StyleConvert = MyStyleConvertFunc // func(string) string
	// 自定义受影响业务tag, 默认 []string{"json","bson"}
	quicktag.TagNames = []string{"json", "bson"}
	// 自定义自引用最大层级, 默认5
	quicktag.MaxSelfRefLevel = 3

	// 注意！！！
	// 如果某类型自己包含了MarshalJSON/UnmarshalJSON等方法，如time.Time，请在字段后手动添加quicktag:"-"来跳过
	// 如
	//data := struct {
	//	ID          string    `bson:"_id"`
	//	CreatedTime time.Time `quicktag:"-"`
	//}

	// struct中原有的tag, 均会保留
}

func main() {
	p := Person{
		Name: "dovejb",
		Age:  6,
		MyChildren: []Person{
			Person{
				Name: "baby",
				Age:  3,
			},
		},
	}

	var p2 Person

	buf, _ := json.Marshal(quicktag.Q(p))
	fmt.Println(string(buf))
	// {"name":"dovejb","age":6,"my_children":[{"name":"baby","age":3,"my_children":null}]}

	json.Unmarshal(buf, quicktag.Q(&p2))
	fmt.Println(reflect.DeepEqual(p, p2))
	// true
}
